// retourne un objet xmlHttpRequest.
// méthode compatible entre tous les navigateurs (IE/Firefox/Opera)
function getXMLHTTP(){
    var xhr=null;
    if(window.XMLHttpRequest) // Firefox et autres
        xhr = new XMLHttpRequest();
    else if(window.ActiveXObject){ // Internet Explorer
        try {
            xhr = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
        try {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e1) {
        xhr = null;
    }
}
}
else { // XMLHttpRequest non supporté par le navigateur
    alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
}
return xhr;
}

var _documentForm=null; // le formulaire contenant notre champ texte
var _inputField=null; // le champ texte lui-même

function initAutoComplete(form,field){
    _documentForm=form;
    _inputField=field;
    _inputField.autocomplete="off";
    creeAutocompletionListe();
    _currentInputFieldValue=_inputField.value;
    _oldInputFieldValue=_currentInputFieldValue;
    cacheResults("",new Array())
    // Premier déclenchement de la fonction dans 200 millisecondes
    setTimeout("mainLoop()",200)
}

var _oldInputFieldValue=""; // valeur précédente du champ texte
var _currentInputFieldValue=""; // valeur actuelle du champ texte
var _resultCache=new Object(); // mécanisme de cache des requetes

// tourne en permanence pour suggerer suite à un changement du champ texte
function mainLoop(){
    _currentInputFieldValue = _inputField.value;    
    if(_oldInputFieldValue!=_currentInputFieldValue){
        var valeur=escapeURI(_currentInputFieldValue);
        var suggestions=_resultCache[_currentInputFieldValue];
        var value=_resultCache[_currentInputFieldValue+"times"];
        if(suggestions){ // la réponse était encore dans le cache
            metsEnPlace(valeur,suggestions, value)
        }else{
        callSuggestions(valeur) // appel distant
    }
    _inputField.focus()
}
_oldInputFieldValue=_currentInputFieldValue;
setTimeout("mainLoop()",200); // la fonction se redéclenchera dans 200 ms
return true
}

// echappe les caractère spéciaux
function escapeURI(La){
    if(encodeURIComponent) {
        return encodeURIComponent(La);
    }
    if(escape) {
        return escape(La)
    }
}

var _xmlHttp = null; //l'objet xmlHttpRequest utilisé pour contacter le serveur

function callSuggestions(valeur){
    var wordToDelete = new Array();
    var valueWord = new Array();
    if(_xmlHttp&&_xmlHttp.readyState!=0){
        _xmlHttp.abort()
    }
    _xmlHttp=getXMLHTTP();
    if(_xmlHttp){
        //appel à l'url distante
        _xmlHttp.open("GET","options.xml?debut="+valeur,true);
        _xmlHttp.onreadystatechange=function() {
            if(_xmlHttp.readyState==4&&_xmlHttp.responseXML) {
                var liste = traiteXmlSuggestions(_xmlHttp.responseXML)
                for(var i = 0; i < liste.length;i++){
                    valueWord.push(liste[i].split(":")[1]);
                    liste.splice(i, 1, liste[i].split(":")[0]);
                }
                for(var i = 0; i < liste.length;i++){
                    if(liste[i].substring(0, valeur.length)!=valeur){
                        wordToDelete.push(liste[i]);
                    }
                }
                for(var j = 0; j < wordToDelete.length;j++){
                    moveWord(wordToDelete[j], liste, valueWord);
                }
                cacheResults(valeur,liste,valueWord)
                metsEnPlace(valeur,liste,valueWord)
            }
        };
        
        // envoi de la requete
        _xmlHttp.send(null)
    }
}

function moveWord(word, tab, value){
    var i = 0;
    while((i < tab.length)&&(tab[i] != word)){
        i++;
    }
    for (var j = i; j < tab.length; j++) {
        tab[j] = tab[j+1];
        value[j] = value[j+1];
    }
    tab.pop();
    value.pop();
}

// Mecanisme de caching des réponses
function cacheResults(debut,suggestions,value){
    _resultCache[debut]=suggestions
    _resultCache[debut+"times"]=value
}

// Transformation XML en tableau
function traiteXmlSuggestions(xmlDoc) {
    var options = xmlDoc.getElementsByTagName('option');
    var optionsListe = new Array();
    for (var i=0; i < options.length; ++i) {
        optionsListe.push(options[i].firstChild.data);
    }
    return optionsListe;
}

var _completeListe=null; // la liste contenant les suggestions

// création d'une div pour les suggestions
// méthode appellée à l'initialisation
function creeAutocompletionListe(){
    _completeListe=document.createElement("TR");
    _completeListe.id="completeDiv";
    document.body.appendChild(_completeListe);
}

function metsEnPlace(valeur, liste, value) {
    while(_completeListe.childNodes.length>0) {
        _completeListe.removeChild(_completeListe.childNodes[0]);
    }
    for (var i=0; i < liste.length; ++i) {
        var count = Math.random()*6; 
        var nouveauElmt = document.createElement("TD")
        var color="<font face='calibri' color="
        if (count<1){
            color+="'#ADD8E6'"
        }
        if (count>=1 && count<2){
            color+="'#9AC0CD'"
        }
        if (count>=2 && count<3){
            color+="'#B2DFEE'"
        }
        if (count>=3 && count<4){
            color+="'#1C86EE'"
        }
        if (count>=4 && count<5){
            color+="'#8470FF'"
        }
        if (count>=5 && count<6){
            color+="'lightblue'"
        }
        var sizeValue = 12;
        if(value[i] > 2)
            sizeValue = 14;
        if(value[i] > 5)
            sizeValue = 18;
        if(value[i] > 10)
            sizeValue = 22;
        if(value[i] > 20)
            sizeValue = 30;
        if(value[i] > 50)
            sizeValue = 50;
        if(value[i] > 100)
            sizeValue = 60;
        if(value[i] > 200)
            sizeValue = 60;
        //alert(liste[i] + " apparait " + valueWord[i]);
        nouveauElmt.innerHTML = color+">&nbsp;<span id='option' style='font-size:"+sizeValue+"px;'>"+liste[i]+"</span></font>"
        _completeListe.appendChild(nouveauElmt)
    }
    $("font").click(function(event){
        event.preventDefault();
        var string = $(this).text()
        var finalToto = string.substring(1, string.length)
        $("input#champ-texte").attr("value", finalToto)
    })
}
